# PRUEBAS CLASE JUGADOR
# coding: utf8

from Carta import Carta
from Jugador import Jugador

def prueba_constructor():
	sur = Jugador(0,"Sur")
	oeste = Jugador(1,"Oeste")
	norte = Jugador(2,"Norte")
	este = Jugador(3,"Este")
	for jugador in (sur,oeste,norte,este):
		assert isinstance(jugador, Jugador)
	assert (sur.id_jugador == 0 and sur.nombre == "Sur" and sur.mano == [])
	assert (oeste.id_jugador == 1 and oeste.nombre == "Oeste" and oeste.mano == [])
	assert (norte.id_jugador == 2 and norte.nombre == "Norte" and norte.mano == [])
	assert (este.id_jugador == 3 and este.nombre == "Este" and este.mano == [])

def prueba_obtener_id_nombre_y_mano():
	sur = Jugador(0,"Sur")
	assert (sur.obtener_id_jugador() == sur.id_jugador and sur.nombre == "Sur" and sur.mano == [])

def prueba_recibir_carta():
	sur = Jugador(0,"Sur")
	carta = Carta(5,Carta.CORAZONES)
	assert sur.mano == []
	sur.recibir_carta(carta)
	assert sur.mano == [carta]
	
def prueba_es_primero():
	#creacion de jugadores
	sur = Jugador(0,"Sur")
	oeste = Jugador(1,"Oeste")
	norte = Jugador(2,"Norte")
	este = Jugador(3,"Este")
	#creacion de cartas
	carta1 = Carta(2,Carta.TREBOLES)	#dos de trébol
	carta2 = Carta(2,Carta.PICAS)
	carta3 = Carta(5,Carta.TREBOLES)
	carta4 = Carta(1,Carta.CORAZONES)
	#Recepcion de cartas
	norte.recibir_carta(carta1)	#primero
	oeste.recibir_carta(carta2)
	sur.recibir_carta(carta3)
	este.recibir_carta(carta4)
	assert norte.es_primero() == True 
	assert oeste.es_primero() == False
	assert sur.es_primero() == False
	assert este.es_primero() == False
	
def prueba_devolver_cartas_a_pasar():
	sur = Jugador(0,"Sur")
	cartas=[Carta(2,Carta.TREBOLES),Carta(2,Carta.PICAS),Carta(5,Carta.TREBOLES),Carta(1,Carta.CORAZONES)]
	for carta in cartas:
		sur.recibir_carta(carta)
	#la mano de "sur" tiene las 4 cartas de la lista	
	assert sur.mano == cartas	
	#devuelvo 3 cartas a pasar
	cartas_a_pasar = sur.devolver_cartas_a_pasar(1)
	assert len(cartas_a_pasar) == 3
	# se queda con una
	assert len(sur.mano) == 1
	# las tres cartas que devolvió eran de su mano
	for carta in cartas_a_pasar:
		assert carta in cartas
	 
def prueba_recibir_cartas_pasadas():
	sur = Jugador(0,"Sur")
	for numero in xrange(1,14):
		sur.recibir_carta(Carta(numero,Carta.DIAMANTES))
	cantidad_inicial=len(sur.mano)
	cartas_recibidas=[Carta(12,Carta.PICAS),Carta(5,Carta.TREBOLES),Carta(1,Carta.CORAZONES)]
	#Guarda las cartas que tiene antes de recibir las 3
	sur.recibir_cartas_pasadas(1,cartas_recibidas)
	cantidad_final=len(sur.mano)
	assert cantidad_inicial+3==cantidad_final
	
def prueba_jugar_carta():
	sur = Jugador(0,"Sur")
	cartas=[Carta(12,Carta.PICAS),Carta(10,Carta.TREBOLES),Carta(3,Carta.CORAZONES),Carta(6,Carta.DIAMANTES),Carta(2,Carta.TREBOLES),Carta(2,Carta.DIAMANTES),Carta(1,Carta.CORAZONES),Carta(1,Carta.CORAZONES)]
	for carta in cartas:
		sur.recibir_carta(carta)
	assert sur.jugar_carta(1, 1, [], False)==Carta(2,Carta.TREBOLES) #Como es la primera mano y es el primero juega el 2 de treboles
	assert len(sur.mano)==len(cartas)-1 #Se le quito una carta	
	#Juega una carta en la primer jugada ya habiendose jugado el 2 de treboles y teniendo una carta del palo Trebol
	cantidad_cartas_ant=len(sur.mano)
	carta=sur.jugar_carta(2,1,[Carta(2,Carta.TREBOLES)],False)
	cantidad_cartas_post=len(sur.mano)
	assert carta.obtener_palo()==Carta.TREBOLES
	assert cantidad_cartas_post==cantidad_cartas_ant-1
	#Juega una carta en la primer jugada sin tener una carta del palo Trebol
	cantidad_cartas_ant=len(sur.mano)
	carta=sur.jugar_carta(3,1,[Carta(2,Carta.TREBOLES)],False)
	cantidad_cartas_post=len(sur.mano)
	assert carta!=Carta(12,Carta.PICAS) #No puede haber jugado la q de picas
	assert carta.obtener_palo()!=Carta.CORAZONES #No puede haber jugado un corazon
	assert cantidad_cartas_post==cantidad_cartas_ant-1
	#Inicia una jugada (Distinta de 1) cuando aun no se jugaron corazones
	cantidad_cartas_ant=len(sur.mano)
	carta=sur.jugar_carta(1,2,[],False)
	cantidad_cartas_post=len(sur.mano)
	assert carta.obtener_palo()!=Carta.CORAZONES,"No deberia haber jugado un corazon"
	assert cantidad_cartas_post==cantidad_cartas_ant-1

def prueba_errores_jugar_carta():
	sur=Jugador(0,"Sur")
	sur.recibir_carta(Carta(12,Carta.PICAS))
	sur.recibir_carta(Carta(1,Carta.CORAZONES))
	
	#Intenta iniciar una mano sin tener el 2 de treboles en su mano
	excepcion1_atrapada=False
	try:
		sur.jugar_carta(1,1,[],False)
	except ValueError:
		excepcion1_atrapada=True
	#Intenta jugar una carta en la primer jugada(sin ser el primero) sin tener cartas distintas de Q de picas o de palo corazones
	excepcion2_atrapada=False
	try:
		print sur.jugar_carta(1,1,[Carta(2,Carta.CORAZONES)],False)
	except ValueError:
		excepcion2_atrapada=True
	assert excepcion1_atrapada
	assert excepcion2_atrapada
	
def prueba_conocer_jugada():
	pass
	
def prueba_str():
	norte = Jugador(2,"Norte")
	assert str(norte) == "Norte (2)"

def pruebas_jugador():
	print "Pruebas jugador \n\r"
	for prueba in (
	prueba_constructor,
	prueba_obtener_id_nombre_y_mano,
	prueba_recibir_carta,
	prueba_es_primero,
	prueba_devolver_cartas_a_pasar,
	prueba_recibir_cartas_pasadas,
	prueba_jugar_carta,
	prueba_errores_jugar_carta,
	prueba_conocer_jugada,
	prueba_str):
		print (prueba.__name__ + ": "),
		prueba()
		print "OK"

pruebas_jugador()
